/*******************************************************************************
    文件名称： 
	开发者：孙磊
	开发时间地点：2013.12.3 
	邮箱：zhongyuansunlei@163.com
	版本信息：
		
********************************************************************************/
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "cvector.h"


int iinit_cvector(cvector **ppcvc,int isize)
{
	cvector *p;
	
	p = (cvector*)malloc(sizeof(cvecotr));
	if(p == NULL) {
		return RC_NOSPACE;
	}
	
	p->m_pbase = (cvector_elem*)malloc(sizeof(cvector_elem)*isize);
	if(p->m_pbase == NULL) {
		return RC_NOSPACE;
	}
	
	p->m_icur = 0;
	p->m_itotalnum = isize;
	
	*ppcvc = p;
	
	return 0;
}


int irealloc_cvector(cvector** ppcvc)
{
	cvector *p = *ppcvc;
	cvecotr *q;
	
	if(iinit_cvector(&q, p->m_itotalnum*2)!=0)
		return -1;
	
	memcpy(q->m_pbase, p->m_pbase, sizeof(cvector_elem)*p->m_itotalnum);
	q->m_icur = p->m_icur;
	
	free(p->m_pbase);
	free(p);
	
	return 0;
}

int ipush_elem_2_cvector(cvector *pcvc, void* pval, int (*mem_alloc_cp_func)(cvector_elem*, void*))
{
	if((pcvc == NULL)||(pval == NULL))
		return RC_NULL_POINTER;
	
	if(pcvc->m_icur+1>=pcvc->m_itotalnum) { // ÒÂÁ
		if(irealloc_cvector(&pcvc))
			return -1;
	}
	
	if(mem_alloc_cp_func(&pcvc->m_pbase[pcvc->m_icur], pval)) {
		return -1;
	}
	
	pcvc->m_icur++;
}

void vreset_cvector(cvector* pcvc)
{
	pcvc->m_icur = 0;
}

void vrelease_cvector(cvector* pcvc, void (*free_func)(void*)) 
{
	for(int i=0;i<pcvc->m_icur;i++) {
		free_func(pcvc->m_pbase[i].m_pval);
	}
	
	free(pcvc->m_pbase);
	pcvc->m_icur=pcvc->m_itotalnum = 0;
	free(pcvc);
}



